查看原文
其他

CVE-2020-1048、CVE-2020-1337漏洞原理及利用

Cc28256 看雪学苑 2022-07-01

本文为看雪论坛优秀文章

看雪论坛作者ID:Cc28256





前言


今年5月,微软发布安全补丁以修补Windows 打印机后台处理程序高危本地提权升级漏洞,编号CVE-2020-1048。它可以获取系统管理员权限,甚至部署持久化后门,影响范围自1996年以来发布(Windows NT 4)的所有Windows版本。


这个漏洞的核心原理在于Windows添加打印机时,对port name的检查函数可以被绕过,设置为任意文件,因此我们可以把任意内容输出到port name对应的系统文件(如某个dll)中,实现权限提升。经过补丁后,紧随其后的CVE-2020-1337又有姿势可以绕检查。





了解需要利用漏洞前一些基本信息


Printers, Drivers, Ports

 

打印机至少有两个要素:


1. 打印机端口


你可以认为它是现在的USB端口,甚至是TCP/IP端口(和地址),打印机可以打印到一个文件(在Windows 8及以上)。


2.打印机驱动程序        


这曾经是一个内核模式组件,但是有了新的"v4"模型,这些都是在用户模式下完成的,到现在已经超过十年。

 

由于以Spooler实施的服务Spoolsv.exe具有SYSTEM特权,并且可以通过网络访问,因此这两个要素吸引了人们执行各种有趣的攻击。


为了使标准用户帐户更容易使用,并且由于这些帐户现在以用户模式运行,只要驱动程序是一个  预先存在的,内置驱动程序,不需要任何特权就可以安装一个打印驱动程序。


Add-PrinterDriver -Name "Generic / Text Only"



添加一个打印机端口:


Add-PrinterPort -Name "C:\windows\tracing\myport.txt"

Get-PrinterPort | ft Name 可以查看到或者查看注册表这个位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports


在peocessmointer监控中可以看到这个动作(发现测试几次截图时搞混了没有原来的图了,下面截图中的C:\windows\test\test.txt实际上是C:\windows\tracing\myport.txt)



系统中添加一台新打印机:


Add-Printer -Name "PrintDemon" -DriverName "Generic / Text Only" -PortName "c:\windows\tracing\myport.txt"


输出到文件:


"Hello,Printer!" | Out-Printer -Name "PrintDemon"

打印到内容在c:\Windows\tracing\myport.txt,我们找到这个文件查看一下:



hiew打开文档会发现内容实际比我们输入的要多,PowerShell认为这是实际的打印机。因此会按照文档格式的边距,为顶部边距添加了几行新内容。 


让我们重新创建新的文件C:\Windows\System32\Ualapi.dll,这个位置因为需要特特殊的权限所以会被阻拦 这个函数会使Windows print spooler服务对端口的合法性校验,当前用户无法将其设置为一个自己不具有访问权限的路径创建文件时,会检查Token权限进行验证,同时IDA中也能找到这段代码:



但是只有当用户选择了“打印到文件”选择框,在打印对话框中可以看到。


在选择其他形式的输出会完全跳过此检查:





Client Side Port Check Vulnerability 
(CVE-2020-1048)


只需要一个PowerShell命令。

PowerShell使用add-printer命令在底层则是直接调用XcvData函数,这个函数可以将port name设置为任意文件而不被检查。

就是这么简单,UI对话框具有检查功能,而PowerShell的WMI打印提供程序模块则没有。

只需Add-PrinterPort -Name c:\Windows\system32\ualapi.dll在PowerShell窗口中执行即可。





CVE-2020-1337


经过补丁后,紧随其后的CVE-2020-1337又有姿势可以绕检查。

从github上获取样本分析
https://github.com/math1as/cve-2020-1337-exploit

powershell -ep bypass -F C:\CVE-2020-1337-exploit-master\exploit.ps1

在查看了公布的脚本文件可以发现它的命令也是非常的简单,在执行上述过程中添加了一条命令创建一个系统目录软联接:

cmd /c mklink /J c:\users\test\mytarg5 C:\Windows\system32

无论是AddPort还是修复后的XcvData函数进行检查时,都是判断当前用户是否具有对目标路径的访问权限的。

将port name指向c:\users\test\myfolder\xxx.dll,通过检查后,再将mytarg5作为一个软链接重定向到目标的系统路径中,即可完成对补丁的绕过。

创建一个软连接,将文件打印位置改为c:\users\test\mytarg5,便会在C:\Windows\system32下成功创建ualapi.dll。




为什么是ualapi.dll


首先能够将这位置释放文件所以我们就要想尽办法利用上,显然容易受到dll劫持尝试攻击的服务第一个突破口。

运行Process Monitor,启动所有服务进行尝试,不过我们要在做的时候需要一些限制,我们现在想提高特权。因此,我们需要尚未启动的服务或者寻找一个可以被标准用户停止的服务。

启动服务通常需要管理权限,这不是我们想要的,通过accesschk工具我们可以很方便的获取所有服务的权限:
accesschk.exe -c * -L > servsddl.txt

servsddl.txt中会记录所有服务输出。

在FAX服务中我们发现了:

[0] ACCESS_ALLOWED_ACE_TYPE: Everyone SERVICE_QUERY_STATUS SERVICE_START


服务中我们可以看到它:


现在让我们启动FAX服务,并通过ProcessMonitor监控他:


在启动打印这个服务时,他会尝试寻找ualapi.dll。

所以我门将这个dll放置到这个位置,然后惊喜的发现,启动spoolsv时会发现也会寻找这个dll:


经过对比他们都有相同的寻找ualapi.dll的代码,在下面的IDA中可以看到,该服务使用GetProcAddress查找ualapi.dll一些导出:


既然能够加载我们先前释放的动态库,dllmain中就可以执行我们想要执行的代码,从github上拿到的示例运行(运行在windows10系统上),他释放了一个PE在system32下,代码也非常简单的运行whoami查看权限。


执行后权限是system,这就代表你能做很多事情。


正当我想着如何利用dll被加载起来后,惊喜的在后面的代码中发现,在spoolsv.exe中也有调用导出函数,这只需要我们稍微构造一下,就能制造一个永久后门,即使补丁修正后它依然存在。





如何避免


如果你不幸被该漏洞利用了,由于即使补丁修正后它依然存在,所以你需要在PowerShell中扫描所有基于文件的端口,查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports其中包含文件路径的任何端口,尤其是以.DLL或扩展名结尾的端口。

这是一个非常容易利用的漏洞,你完全可以将一份后门代码构造出现在spoolsv.exe的调用中。





参考文献


https://github.com/math1as/cve-2020-1337-exploit
https://github.com/ionescu007/faxhell
https://mp.weixin.qq.com/s/LLzIlKrrfpJuk6CGBRZMvw
https://windows-internals.com/faxing-your-way-to-system/
https://windows-internals.com/printdemon-cve-2020-1048/




- End -



看雪ID:Cc28256

https://bbs.pediy.com/user-845934.htm

  *本文由看雪论坛 Cc28256 原创,转载请注明来自看雪社区。



推荐文章++++

* 溢 出 大 师

* Windows不太常见的进程注入学习小记(一)

* 脚本类恶意程序的快速分析技巧

* 萌新逆向学习笔记——消息钩子键盘记录

* 关于Kimsuky的一次恶意样本分析小记







公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com


求分享

求点赞

求在看


“阅读原文”一起来充电吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存